﻿using System;
using System.Collections.Generic;
using System.Linq;
using PortalCurriculo.Domain;
using PortalCurriculo.Util.Translation;
using PortalCurriculo.WebUI.Constants;
using PortalCurriculo.WebUI.Helpers;

namespace PortalCurriculo.WebUI.UserControls.Curriculo.Cadastro
{
    public partial class Conhecimento : Curriculo, ICurriculo
    {
        public List<ConhecimentoCurriculo> Entidades { private get; set; }

        public string ValidationGroup
        {
            get { return txtOutro.ValidationGroup; }
            set
            {
                txtOutro.ValidationGroup =
                    ddlNivel.ValidationGroup =
                    ddlConhecimento.ValidationGroup =
                    ddlSubConhecimento.ValidationGroup = value;
            }
        }

        #region ICurriculo Members

        public void Editar()
        {
            LimparCampos();

            var conhecimento = (from linq in Entidades
                                where linq.Id.Equals(IdEntidade)
                                select linq).FirstOrDefault();

            ddlNivel.SelectedValue = conhecimento.IdNivelConhecimento.ToString();
            chkCertificado.Checked = conhecimento.Certificado;

            if (!string.IsNullOrEmpty(conhecimento.Outro))
            {
                txtOutro.Value = conhecimento.Outro;
                ddlConhecimento.SelectedValue = "-1";
                pnlOutro.Visible = true;
            }
            else
            {
                ddlConhecimento.SelectedValue = conhecimento.Conhecimento.Conhecimento2.Id.ToString();
                PreencherDropDownSubConhecimento();
                ddlSubConhecimento.SelectedValue = conhecimento.Conhecimento.Id.ToString();
                pnlOutro.Visible = false;
            }

            LimparCampos();
        }

        public void LimparCampos()
        {
            txtOutro.Value = string.Empty;
            ddlConhecimento.SelectedIndex = 0;
            ddlSubConhecimento.SelectedIndex = 0;
            ddlNivel.SelectedIndex = 0;
        }

        public void Salvar()
        {
            var conhecimentoCadastrado = (from linq in Entidades
                                          where
                                              (linq.IdConhecimento == int.Parse(ddlSubConhecimento.SelectedValue) ||
                                               linq.Outro == txtOutro.Value)
                                              && (IdEntidade == 0 || linq.Id != IdEntidade)
                                          select true).FirstOrDefault();

            if (conhecimentoCadastrado)
                throw new AlreadyExistsException(Translator.TranslateMessage(Messages.ConhecimentoJaCadastrado,
                                                                             AppRelativeVirtualPath));

            var conhecimento = IsNew
                                   ? new ConhecimentoCurriculo()
                                   : Entidades.Where(esp => esp.Id == IdEntidade).FirstOrDefault();

            conhecimento.Ativo = true;
            conhecimento.IdCurriculo = IdCurriculo;
            conhecimento.IdNivelConhecimento = int.Parse(ddlNivel.SelectedValue);
            conhecimento.Certificado = chkCertificado.Checked;

            if (ddlConhecimento.SelectedIndex == ddlConhecimento.Items.Count - 1)
                conhecimento.Outro = txtOutro.Value;
            else
            {
                conhecimento.IdConhecimento = int.Parse(ddlSubConhecimento.SelectedValue);
                conhecimento.Outro = null;
            }

            conhecimento.Save();

            if (IsNew)
                Entidades.Add(conhecimento);
        }

        #endregion

        protected void Page_Load(object sender, EventArgs e)
        {
            ddlConhecimento.TextChanged += OnChangeControl;

            if (IsPostBack) return;

            PreencherDropDownLists();
        }

        private void PreencherDropDownLists()
        {
            WebHelper.FillDropDownList(ddlConhecimento,
                                       new Domain.Conhecimento {IdConhecimentoPai = Database.IdConhecimentoInformatica}.
                                           SelecionarPorIdPai(), false);
            PreencherDropDownSubConhecimento();
            WebHelper.FillDropDownList(ddlNivel,
                                       new NivelConhecimento().SelectAllActive<NivelConhecimento>().OrderBy(d => d.Ordem),
                                       false, "Nome");
        }

        private void PreencherDropDownSubConhecimento()
        {
            WebHelper.FillDropDownList(ddlSubConhecimento,
                                       new Domain.Conhecimento
                                           {IdConhecimentoPai = int.Parse(ddlConhecimento.SelectedValue)}.
                                           SelecionarPorIdPai(), false);
        }

        protected void ddlConhecimento_SelectedIndexChanged(object sender, EventArgs e)
        {
            PreencherDropDownSubConhecimento();
        }
    }
}